package org.example._05_chat;

import java.awt.*;
import java.awt.event.*;
import java.io.IOException;
import java.net.Socket;
import java.net.SocketException;
import java.net.UnknownHostException;
import java.io.*;


//在这版本中需要提出的是，
//这个聊天系统中的每一个客户端都在给服务器输出数据，而服务器都在给每个客户端在textArea中显示出来的。

class ChatClient extends Frame {
    TextField tf = new TextField();
    TextArea ta = new TextArea();

    DataOutputStream dos = null;
    DataInputStream dis = null;

    public Socket s = null;
    private boolean beConnect = false;

    public static void main(String[] args) {
        new ChatClient().launchFrame();
    }

    public void launchFrame() {
        setLocation(300, 300);
        this.setSize(300, 300);
        add(tf, BorderLayout.SOUTH);
        add(ta, BorderLayout.NORTH);
        pack();
        this.addWindowListener(new WindowAdapter() {
            public void windowClosing(WindowEvent e) {
                disConnect();
                System.exit(0);
            }
        });
        tf.addActionListener(new FtListener());
        setVisible(true);
        connect();

        new Thread(new RecevThread()).start();
    }

    public void connect() {
        try {
            s = new Socket("127.0.0.1", 8888);
            dos = new DataOutputStream(s.getOutputStream());//在一连接上就对这个dataputstream初始化。
            dis = new DataInputStream(s.getInputStream());
            System.out.println("connet!");
            beConnect = true;
        } catch (UnknownHostException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

    public void disConnect() {
        try {
            dos.close();
            dis.close();
            s.close();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

    private class FtListener implements ActionListener {
        //用FtListener中特有的ActionListener来监听回车键，避免了使用键盘监听的麻烦。

        public void actionPerformed(ActionEvent e) {//用回车建响应ActionEvent
            String str = tf.getText().trim();//用字符数获取一行字符串首位的空格去掉用trim()。
//			ta.setText(str);//在使用run方法中的ta.setText使用的时候，就不再需要这句话了。
            tf.setText("");
            try {
//				 dos = new DataOutputStream(s.getOutputStream());//创建一个dateooutputstream，注意：此句话没有写入数据
                //在此写入数据到服务器
                dos.writeUTF(str);
                dos.flush();
//				dos.close();
            } catch (SocketException s) {
                System.out.println("写入数据失败,对方退出了！");
            } catch (IOException e1) {
                // TODO Auto-generated catch block
                e1.printStackTrace();
            }
        }

    }

    private class RecevThread implements Runnable {

        public void run() {
            try {
                while (beConnect) {
                    String str = dis.readUTF();
                    ta.setText(ta.getText() + str + '\n');//注意：这里的str是局部变量，仅仅代表的是上一句话的内容。
                }
            } catch (SocketException e) {
                System.out.println("退出了，，bay！");
            } catch (IOException e) {
                e.printStackTrace();
            }

        }

    }
}





